/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.example;

import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.commons.lang3.time.DateUtils;
import org.apache.flink.api.common.RuntimeExecutionMode;
import org.apache.flink.api.common.eventtime.WatermarkStrategy;
import org.apache.flink.api.common.functions.FilterFunction;
import org.apache.flink.api.common.functions.MapFunction;
import org.apache.flink.api.common.functions.OpenContext;
import org.apache.flink.api.common.serialization.SimpleStringEncoder;
import org.apache.flink.api.common.state.ValueState;
import org.apache.flink.api.common.state.ValueStateDescriptor;
import org.apache.flink.configuration.MemorySize;
import org.apache.flink.connector.file.sink.FileSink;
import org.apache.flink.connector.file.src.FileSource;
import org.apache.flink.connector.file.src.reader.TextLineInputFormat;
import org.apache.flink.core.fs.Path;
import org.apache.flink.shaded.guava32.com.google.common.hash.BloomFilter;
import org.apache.flink.shaded.guava32.com.google.common.hash.Funnels;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.datastream.DataStreamSource;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.streaming.api.functions.KeyedProcessFunction;
import org.apache.flink.streaming.api.functions.sink.filesystem.OutputFileConfig;
import org.apache.flink.streaming.api.functions.sink.filesystem.rollingpolicies.DefaultRollingPolicy;
import org.apache.flink.streaming.api.functions.windowing.ProcessWindowFunction;
import org.apache.flink.streaming.api.windowing.windows.GlobalWindow;
import org.apache.flink.util.Collector;

import java.nio.charset.StandardCharsets;
import java.time.Duration;
import java.util.*;

/**
 * 跑最近十天的数据
 */
public class DataStreamJob2 {

	public static void main(String[] args) throws Exception {

		// 设置执行环境
		StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
		 env.setRuntimeMode(RuntimeExecutionMode.BATCH);

		Path[] paths = buildInputPaths(10);

		// 输出路径（根据日期动态生成）
		String outputPath = "s3://aws-origin-data-bucket-20250112/distinct/" + getCurrentDatePath();

		// 读取S3上的所有.gz文件
		FileSource<String> fileSource = FileSource.forRecordStreamFormat(
				new TextLineInputFormat(), paths
		).build();

		DataStreamSource<String> inputData = env.fromSource(
				fileSource,
				WatermarkStrategy.noWatermarks(),
				"s3-input"
		);

		// 处理数据：按设备ID分组，保留最新时间戳的数据
		DataStream<DeviceInfo> deduplicatedStream = inputData
				// 将每行数据解析为DeviceInfo对象
				.map(new ParseLogLineMapper())
				// 过滤掉解析失败的行
				.filter(new ValidDeviceInfoFilter())
				// 按设备ID分组
				.keyBy(DeviceInfo::getDeviceId)
				.reduce((prev, curr) -> {
					if (curr.getTimestamp() > prev.getTimestamp()) {
						return curr;
					} else {
						return prev;
					}
				})
		;

		// 配置输出文件格式和滚动策略
		OutputFileConfig outputFileConfig = OutputFileConfig
				.builder()
				.withPartPrefix("device_id_distinct")
				.withPartSuffix(".log")
				.build();

		// 将结果写入S3，每100万条数据生成一个新文件
		final FileSink<String> sink = FileSink
				.forRowFormat(new Path(outputPath), new SimpleStringEncoder<String>("UTF-8"))
				.withRollingPolicy(
						DefaultRollingPolicy.builder()
								.withRolloverInterval(Duration.ofMinutes(1))
								.withInactivityInterval(Duration.ofMinutes(1))
								.withMaxPartSize(MemorySize.ofMebiBytes(256))
								.build())
				.withOutputFileConfig(outputFileConfig)
				.build();

		// 将处理后的数据写入目标位置
		deduplicatedStream.map(new MapFunction<DeviceInfo, String>() {
					@Override
					public String map(DeviceInfo deviceInfo) throws Exception {
						String join = String.join(",", Arrays.asList(
								deviceInfo.getDeviceId(),
								DateFormatUtils.format(new Date(deviceInfo.getTimestamp() * 1000L), "yyyy-MM-dd HH:mm:ss")));
						return join;
					}
				})
//				.print();
                .sinkTo(sink);

		// 执行作业
		env.execute("Device ID Deduplication Job");
	}

	private static Path[] buildInputPaths(int day) {
		Date now = new Date();
		List<Path> paths = new ArrayList<>();
		for (int i = 1; i <= day; i++) {
			String format = DateFormatUtils.format(DateUtils.addDays(now, -i), "yyyy-MM-dd");
//			String fullPath = "s3://aws-origin-data-bucket-20250112/test/" + format + "/usa/android" + "/" + format + "-00.android.usa.us";
			String fullPath = "s3://aws-origin-data-bucket-20250112/test/" + format + "/usa/android";
			paths.add(new Path(fullPath));
		}
		return paths.toArray(new Path[0]);
	}

	/**
	 * 解析日志行的映射函数
	 */
	public static class ParseLogLineMapper implements MapFunction<String, DeviceInfo> {
		@Override
		public DeviceInfo map(String logLine) {
			try {
				String[] fields = logLine.split("@");
				if (fields.length != 13) {
					return null;
				}

				return new DeviceInfo(
						fields[0],
						fields[1],
						fields[2],
						fields[3],
						fields[4],
						fields[5],
						fields[6],
						fields[7],
						Long.parseLong(fields[8]),  // timestamp
						fields[9],
						fields[10],
						fields[11],
						fields[12]
				);
			} catch (Exception e) {
				return null;
			}
		}
	}

	public static class DeviceIdProcessWindowFunction extends ProcessWindowFunction<DeviceInfo, DeviceInfo, String, GlobalWindow> {
		@Override
		public void process(String s, ProcessWindowFunction<DeviceInfo, DeviceInfo, String, GlobalWindow>.Context context, Iterable<DeviceInfo> elements, Collector<DeviceInfo> out) throws Exception {
			// 输出时间戳最大的
			DeviceInfo deviceInfo = null;
			for (DeviceInfo element : elements) {
				if (deviceInfo == null || element.getTimestamp() > deviceInfo.getTimestamp()) {
					deviceInfo = element;
				}
			}
			out.collect(deviceInfo);
		}
	}
	/**
	 * 过滤有效DeviceInfo的过滤器
	 */
	public static class ValidDeviceInfoFilter implements FilterFunction<DeviceInfo> {
		@Override
		public boolean filter(DeviceInfo deviceInfo) {
			Set<String> targetGaids = new HashSet<>();

			targetGaids.add("58ecf2dd-76a5-4648-b95e-69e896afdf12");
			targetGaids.add("ae056a00-cba3-4b46-93b4-de236943aaec");
			targetGaids.add("c9604a2c-2cc0-468c-b07d-f6e4ceea3af4");
			targetGaids.add("327ce140-4a21-4c05-afbe-ae641f7ac14e");
			targetGaids.add("5cdbebe2-b09d-4dbd-b5a4-931913e0a6b0");
			targetGaids.add("6e4f1926-9bff-4222-b43c-a0f957b1e5c0");
			targetGaids.add("54ac1959-5d7d-4197-9f1c-e745799ff703");
			targetGaids.add("1a25d2ef-34a3-41ef-b72f-97c0f2996d9e");
			targetGaids.add("9ba15fb8-3758-452c-b2e2-a082527a8f7c");
			targetGaids.add("04788ba4-cd33-4730-8d32-3c0fd8daf562");
			targetGaids.add("2ba9ebc5-94a9-4e92-951f-60c4a8b7d3eb");
			targetGaids.add("4adecaaa-ed85-45ed-942f-61be79054c98");
			targetGaids.add("952cc6e9-89f2-4b19-a63b-eeeb4871fc6b");
			targetGaids.add("722a9814-164a-40bd-98c7-6a7458e6cfb9");
			targetGaids.add("502c53b9-710d-4eed-935d-8c83421ada22");
			targetGaids.add("88b616d7-aa14-47ed-adf5-86e83274be92");
			targetGaids.add("114e0825-4a73-4649-b180-99a77f0f20b2");
			targetGaids.add("c9bfa023-028f-453d-bef5-245b241a0751");
			targetGaids.add("1003d8af-ba97-4226-9320-ba07bb001bb7");
			targetGaids.add("d37ef619-b9d4-4545-99d8-0d8b013c32bb");
			targetGaids.add("147d3ccc-4520-4693-878d-acf452f95e99");
			targetGaids.add("78173be1-f1a8-4eab-a656-2fe28e977c6c");
			targetGaids.add("66cc4736-95f8-4f22-896a-e3f60a154ce2");
			targetGaids.add("dbe5eef2-9e13-40c1-a2e2-de2410920782");
			targetGaids.add("8dd82501-2778-4139-b47a-c7ce7ab389e4");
			targetGaids.add("b70653ff-5946-49b3-9be8-4c2fc40532bc");
			targetGaids.add("99df64b2-697b-47e9-b006-eeecdf7ecc7d");
			targetGaids.add("c8772451-c6ca-4572-8c6a-86062f839eb6");
			targetGaids.add("e3c4e321-eb88-4bbd-9a0c-e60d1a15c5f7");
			targetGaids.add("5187fdf5-cb2e-47eb-b12b-7b00ca20a8e3");
			targetGaids.add("de75ebee-b042-4605-bf1a-943fa3b52c51");
			targetGaids.add("3ed721b1-dcf8-423e-9a26-0612532eb904");
			targetGaids.add("6b1b20b7-a6a0-49e9-bfc9-7a05e6125ef0");
			targetGaids.add("2159e1fd-bb5f-4bc6-8e48-a2f4ad65fb28");
			targetGaids.add("52b73d0b-0e88-4208-9a1b-66a123355342");
			targetGaids.add("9cf01cc9-2a9e-46f7-bdc8-82c8bea8e370");
			targetGaids.add("ac43916e-cdae-44f8-ae82-bee9f288e96d");
			targetGaids.add("72518385-d10d-4585-88d6-f4600749b0cd");
			targetGaids.add("f4e2ee4c-53e1-49e9-8823-018704b17aef");
			targetGaids.add("daae9ca7-b9c7-4f2f-bbf7-7fcbab9fb9a9");
			targetGaids.add("056a71d1-c6e7-43ff-a768-143e90561f8d");
			targetGaids.add("8fa5ce8e-0f56-4482-93b6-1bcfed624b4b");
			targetGaids.add("8a42385f-a0a5-4ea0-a8da-b6ef970bae74");
			targetGaids.add("dc76c38e-6159-42e0-b18c-625840cef8bc");
			targetGaids.add("30f75ceb-5d14-438d-92c0-a9ecdd541aeb");
			targetGaids.add("49d7f1be-0dca-4c6c-86b7-8728b3495199");
			targetGaids.add("1133f51f-493b-4d27-92cc-ce53ceb993bc");
			targetGaids.add("d65fbf95-6e72-46b2-bf76-06ff93af2acd");
			targetGaids.add("800c0a62-6bf9-4e57-b446-2274738305d5");
			targetGaids.add("87fa595a-a4a8-4fd2-9d4e-46f9f4a89813");
			targetGaids.add("6096d7f1-d154-4cd8-b1e0-6ef92c92ce90");
			targetGaids.add("14F67278-7F61-4B9A-B69A-E0334A5B354A");
			targetGaids.add("901df43f-7325-42a6-b739-df209cc8ccce");
			targetGaids.add("b2c4f804-4bae-462d-b688-e6acb728051e");
			targetGaids.add("6b2e7922-709e-4d07-b0dd-ab7fbdce0b48");
			targetGaids.add("be5a51c6-b668-4e99-b249-2be39489f83a");
			targetGaids.add("c2ae9627-ed04-4cbf-8104-adec2961cec6");
			targetGaids.add("e0646e2d-ab14-496c-baf5-b3148f8e1c7c");
			targetGaids.add("805faa39-809d-419f-b0f2-a30cda6ff829");
			targetGaids.add("74883486-a04b-4eb6-a105-64cd513d0743");
			targetGaids.add("f3beb8c6-fe0b-4892-9e13-4c402e7a4206");
			targetGaids.add("3e4e3fd5-541e-467e-8241-046a99496a40");
			targetGaids.add("4b2f6723-b31b-456e-906e-a6db7d6a354f");
			targetGaids.add("66cec1a9-7e9a-4ba1-abf3-1664840a9aa9");
			targetGaids.add("6b5eba1b-773f-4f63-89b4-95f07fcaa6f7");
			targetGaids.add("ddcb05e3-562d-47fb-b5d9-2d289ee13264");
			targetGaids.add("aa1b79cb-2959-4167-beea-be690599d7af");
			targetGaids.add("fcc14805-36b9-498b-805a-07710013d8ba");
			targetGaids.add("45dae91e-6ab5-48b7-978a-63d109c29c5a");
			targetGaids.add("295589e1-d6d1-443d-82c4-2e0c21791c16");
			targetGaids.add("5588f558-fb2b-4df3-8750-b6e886a22bfc");
			targetGaids.add("d1fe45ca-9db2-463b-a837-147361180079");
			targetGaids.add("4e3f9d06-3e5d-4573-92a9-53a9917d459e");
			targetGaids.add("8c106300-1e41-47fc-83e1-989f4c8d455f");
			targetGaids.add("7780a722-46bf-40cb-bfc2-684fc1174ce5");
			targetGaids.add("445e591f-b294-4f09-aea9-571b65d2d686");
			targetGaids.add("ce17b7fa-c540-40f6-8d76-74a5359aed11");
			targetGaids.add("a0fefc0b-bb81-4552-b253-49aa83d2f307");
			targetGaids.add("97e6d289-b1a5-4c6c-b639-ca2aacb3ecd9");
			targetGaids.add("42f131ed-b810-4bb3-95aa-6596895ff300");
			targetGaids.add("1a2ab24f-0554-4003-b026-a508a417f328");
			targetGaids.add("d68bb035-cbb0-4bc9-b37b-2c15a5e02a4b");
			targetGaids.add("807dd4d0-c38b-4c42-9973-d3616d4e25eb");
			targetGaids.add("323262b4-9ca2-435f-9989-aae36da2f801");
			targetGaids.add("b30e0b12-9c73-4633-b0aa-97f409132eb3");
			targetGaids.add("b39347d5-f8d7-480b-b58d-8e0312d92923");
			targetGaids.add("1955eb55-151e-4d45-ac98-31e53a9d9a39");
			targetGaids.add("54394a6a-559c-4610-a03a-84b19a16d560");
			targetGaids.add("e77f59a3-f3a0-4bd0-8486-754e9f39dcdd");
			targetGaids.add("73d1cc64-cc9d-4643-968a-600e09c211a7");
			targetGaids.add("9c5b33ec-40fa-4751-b48b-79cefab48b3b");
			targetGaids.add("ab1d574a-64f7-4da9-96a8-3d60af81c1fb");
			targetGaids.add("9c6c0b68-8bbd-4121-bd9f-d463904c508b");
			targetGaids.add("c69ca53f-0c47-46d9-a4ca-1d1c1065d2f7");
			targetGaids.add("b7a76e3f-3acc-4b87-bd73-10ca445298fe");
			targetGaids.add("26bd8b2e-5768-4336-a7fb-cc6743efa1fd");
			targetGaids.add("fccf3b46-132c-48ab-bf25-ece6a9daabed");
			targetGaids.add("93694ce4-c5c6-4058-b0ae-d178b11fcfd9");
			targetGaids.add("4848a28d-4953-47a7-8503-591123aa8c1a");
			targetGaids.add("2617291a-04cc-4c3b-b25e-836b86de73ab");
			targetGaids.add("0167478d-f366-44ef-a020-112034095744");
			targetGaids.add("ff6bfb9f-9b7f-5523-fdff-7f9fd2a9a930");
			targetGaids.add("2fa57087-79f2-4dd8-bb83-a7e71bad5691");
			targetGaids.add("087c79af-ac74-47db-a1c4-a1101ce85304");
			targetGaids.add("43c7fdbe-aacf-4df7-aa84-5aedb22909a5");
			targetGaids.add("9a34a99a-24c8-472b-82e0-28d0dbc8de4a");
			targetGaids.add("1622d50a-4968-423c-9644-f0a4e048dc51");
			targetGaids.add("c6b02e9a-eb62-4603-a4d6-d450166fe7cf");
			targetGaids.add("2b52a6e5-f367-499b-826d-308ca8982169");
			targetGaids.add("5320c0b7-1e24-4012-8233-60a6addf0359");
			targetGaids.add("179c2c85-533e-4b9b-8cd0-d8a47a1b40ef");
			targetGaids.add("da8d4e63-11c6-4e9f-967a-5f999c1f6a97");
			targetGaids.add("3c031e67-382a-43bf-bc0d-793e5026bb55");
			targetGaids.add("d9d10993-bfda-4454-a738-5bcb348666bb");
			targetGaids.add("68491380-150d-4c6e-9701-032003e838ab");
			targetGaids.add("dad52b4f-ed3c-439c-a8f7-1a45748307d4");
			targetGaids.add("f42b0ae0-2aa2-4637-bbee-35f47253a13d");
			targetGaids.add("6d396d1f-c24b-461a-afd4-f87cd8ed6ed4");
			targetGaids.add("d05aa694-660a-43c4-b158-2f0c3b07f005");
			targetGaids.add("4fc6a4e3-1224-447c-9e31-051d27ec78a5");
			targetGaids.add("97c51cbd-b92d-4bbd-8d56-16cb9e59c6ea");
			targetGaids.add("3452b93d-95ba-4587-8499-5fa5b64184c5");
			targetGaids.add("e953f09f-93f8-4683-8d4f-ef32f23fd698");
			targetGaids.add("1e683767-b303-445e-8d98-b545be16d33a");
			targetGaids.add("e6570295-2af7-49c0-842c-3fff5d6b3fe2");
			targetGaids.add("d0f13bba-862c-4ad6-ab5c-20bf8b42efad");
			targetGaids.add("3c215259-ff57-4a16-9f4e-4619079fdadb");
			targetGaids.add("c849de12-b661-4ff1-90d3-33ec7db408cf");
			targetGaids.add("d70dece0-fbd5-4673-adda-2b47b0a2ade4");
			targetGaids.add("2cfc267f-5a5a-4953-bd91-f71dfec8e6d2");
			targetGaids.add("d1cf6e44-cac4-47e5-92c0-cad8a22046f8");
			targetGaids.add("130a296d-0168-4e9f-b304-ba47f69e40b9");
			targetGaids.add("1777ee48-8a89-4f0a-9252-e0a0128cbad1");
			targetGaids.add("bdfdd15f-9f17-47bd-9e07-022abb0c41ba");
			targetGaids.add("23dc9b16-e72c-41fb-bb0a-d7ac2a77258e");
			targetGaids.add("009b45ea-35cf-4d5c-b680-3d05e84add5d");
			targetGaids.add("02499229-76d9-4a62-9e74-8a9f6bca90ba");
			targetGaids.add("5bb41964-30c7-4609-8aa6-8ddc9f419642");
			targetGaids.add("8a90cd96-5c24-471d-af51-18b13917be91");
			targetGaids.add("cc463ffc-bdc6-4c5c-88ba-18f5262094eb");
			targetGaids.add("9233ba2a-2496-4405-bd8f-c74159be26bc");
			targetGaids.add("b9641f50-888a-41f9-a393-186e8228f2aa");
			targetGaids.add("df5e4d43-894e-4c77-8fa9-57bb88efe5f7");
			targetGaids.add("34f7c9c8-dba4-41ad-bdb2-d5439c310965");
			targetGaids.add("e5862924-fd63-457e-8740-e3f6ea508fcd");
			targetGaids.add("5d248f0a-6cff-46c2-8532-4a8a42358808");
			targetGaids.add("6f01dba7-a204-4024-9d0b-8e9052bcd750");
			targetGaids.add("0dc84ddd-117c-4561-993c-b76b1cc712c0");
			targetGaids.add("6238eee2-8403-4012-a623-449b50bdcfe7");
			targetGaids.add("0c69d890-bc1d-424b-be94-32567ab8f497");
			targetGaids.add("557c6968-5cb9-46c8-ad80-7716f81092eb");
			targetGaids.add("fd9d0f9b-4b42-417d-839f-6dc912b79892");
			targetGaids.add("491b05b1-919e-4353-9173-14763e328cab");
			targetGaids.add("f25721ea-bae3-4d8a-be6e-461f0b5753dd");
			targetGaids.add("c288f18b-63db-461f-af78-6270a00705aa");
			targetGaids.add("e0427d90-c5c4-43f8-90fb-9865347877a5");
			targetGaids.add("a47b9f44-bdcc-4578-8511-b40e8832894f");
			targetGaids.add("871f0c03-3791-4aa1-91a5-997d4133a02b");
			targetGaids.add("fdc2e68c-bce0-4e97-b4c4-b54ff047962e");
			targetGaids.add("ca14dd03-6501-4b60-a9c9-8f1521e6b588");
			targetGaids.add("774a9e65-413e-4e01-80d9-c5a4489d67c4");
			targetGaids.add("38c546fb-3ae7-432f-804d-aeaf21ac3230");
			targetGaids.add("fa0465ea-b853-4925-b404-5b3141ec8b1e");
			targetGaids.add("bbb238d0-e283-493f-ba96-8d07eca1b6cd");
			targetGaids.add("b93af691-d088-4ad0-b42f-f177ec671fba");
			targetGaids.add("a2a9baae-20f7-4e1e-9999-4f0995dfd2ba");
			targetGaids.add("04414770-f236-4c7c-8859-5509d7f7c02a");
			targetGaids.add("3849cdfa-1b18-4578-ac22-c2766e734bf0");
			targetGaids.add("d7e4aebc-5125-4200-88da-ee882a7c8ddd");
			targetGaids.add("1a9840ab-9dbf-45e8-8324-b97450d1e6fa");
			targetGaids.add("a95e0fef-5e12-421a-bc35-8a73b5ccc052");
			targetGaids.add("e22bdb9d-89e3-46bd-88c3-f4a07425dd34");
			targetGaids.add("293a46d1-6637-4fe5-adac-9ce6cb576e7f");
			targetGaids.add("88472964-ff77-4ca8-ade1-0d33a1999dd5");
			targetGaids.add("5742ca33-3c3f-4df4-ac46-6130f78181f2");
			targetGaids.add("5443ab0b-6fa3-4200-ba7f-a804ddc7d68b");
			targetGaids.add("1fe9769e-5a4e-474b-9654-b3068a0b680f");
			targetGaids.add("b55cf33c-e4ff-4946-9163-f91e63613207");
			targetGaids.add("37e61581-ba15-4994-a199-7bed5f76f4ec");
			targetGaids.add("205f10a3-1073-4c7d-9461-ade51327c6c8");
			targetGaids.add("293e476b-6bfb-422e-bf42-7c6e4cccd079");
			targetGaids.add("a41479fe-25af-4f42-aa64-f8b369345db4");
			targetGaids.add("8bef8444-95d4-45d0-b815-dbc3fd1a5541");
			targetGaids.add("f3e63e1e-8b74-4d60-9c57-9335851c320e");
			targetGaids.add("df48a6da-7df3-4775-a973-4fd973f18f70");
			targetGaids.add("1af4701b-cfce-4ecd-be26-c123a9635edd");
			targetGaids.add("ea21e268-d5a9-4480-9e11-3bd336574292");
			targetGaids.add("d8c45c78-ce57-4e63-9522-74ff4309dcfb");
			targetGaids.add("1bea0c8e-b754-4a2c-a504-21a9b5e7c1b4");
			targetGaids.add("3a170198-5180-4a58-9bd1-8cc6118d9f1a");
			targetGaids.add("93d2f014-dfe2-46ca-8be6-02ceaa78c389");
			targetGaids.add("dffa919c-17e1-4235-b574-52a39949d40a");
			targetGaids.add("24f6d000-31f5-440b-af54-f9c799414312");
			targetGaids.add("e9cfcfda-e5ab-4f67-aab1-ad6b84b84dc1");
			targetGaids.add("811a391d-a49c-47eb-a6a7-003ebb001b6d");
			targetGaids.add("3831b39e-da80-4941-a734-380ed4917288");
			targetGaids.add("9ba3e786-6acc-4a86-b64c-cd83ea9b1926");
			targetGaids.add("9a57ba22-1fe8-4924-9e15-bb769dc97200");
			targetGaids.add("8e23ada6-0c1f-43ca-874d-361c86ced56a");
			targetGaids.add("4a3c5345-b303-43fd-955e-c44bf1d89eda");
			targetGaids.add("cb31e02e-6836-4843-baab-e5638176f179");
			targetGaids.add("8075d826-7501-4364-9f00-bcdd62504e2e");
			targetGaids.add("04dcb9f3-60b6-448f-89d0-a28c63142a29");
			targetGaids.add("fd1597b8-bb26-42ea-9876-3bfe511f3f46");
			targetGaids.add("1ff243a1-a8ef-4df3-a98c-33845360c9ad");
			targetGaids.add("f0274ab4-e37e-4c76-ac93-2f175cd3520a");
			targetGaids.add("51860d47-4890-4aa3-b510-676a64765ea0");
			targetGaids.add("fdeecb83-f6fc-42ba-b0f6-b002c056258e");
			targetGaids.add("8f5a714b-a603-48d1-9af1-99ec8c500522");
			targetGaids.add("37f188f8-f4f8-4080-a4be-dc56f7017447");
			targetGaids.add("104157cb-2c9f-445b-9a22-97873393db8c");
			targetGaids.add("8dce91cc-6d92-4c1c-94b8-9e872c936d87");
			targetGaids.add("eb670ad9-53dd-43ca-8b5b-46fa0c15f6f6");
			targetGaids.add("80e369cc-bfcd-4f72-992e-0f8f5ebb1973");
			targetGaids.add("1aa9268b-9357-4607-870e-c0d4690ecb02");
			targetGaids.add("1522beb2-4d51-475e-8584-28583c13f594");
			targetGaids.add("758084c4-8b83-4572-9b16-beff1d74d264");
			targetGaids.add("1068a74c-c14b-444f-93ae-bca2ee29f034");
			targetGaids.add("b8fb7fcf-3518-475b-8eb9-0be2645e3b79");
			targetGaids.add("cdc50397-7bf1-47b8-b502-6162d64b019a");
			targetGaids.add("39bd437e-b5dd-4a81-acd2-43231e59d6fe");
			targetGaids.add("7559f241-69cf-4feb-bf3f-346bdd10ecf0");
			targetGaids.add("0f484e44-2044-4856-8531-2a2f276548d9");
			targetGaids.add("9df28a52-382e-4493-a953-49a4be843bf9");
			targetGaids.add("bfa0d0b2-c2fa-4d18-b900-e0cb76baf3fb");
			targetGaids.add("4aad9686-e248-49fe-8a3a-01ac3b98bf19");
			targetGaids.add("bbd9a498-0b26-409d-8d0d-93129bf0c3a3");
			targetGaids.add("c5307c25-e4e1-4aef-b6e4-abf4e58ace0b");
			targetGaids.add("588d8b2a-f7ac-47b2-9882-c4642235b9a3");
			targetGaids.add("3ad8144c-39cf-4824-8fa7-66c523f0089a");
			targetGaids.add("fe992598-2ac9-4139-87ad-c58a4e45314f");
			targetGaids.add("14d8918e-ae81-427c-9bd5-7867231e4d42");
			targetGaids.add("d76b1f83-e5ba-44a0-b49f-fea360221b40");
			targetGaids.add("daf1db54-b3d7-489a-b0f0-799ab9e5df96");
			targetGaids.add("bf125ce0-9f76-454e-b3f8-2a3a1bde8886");
			targetGaids.add("33136a22-500b-4de9-8a30-158a581bb2a1");
			targetGaids.add("d1dba365-0a64-4912-858f-5cd2b8c12314");
			targetGaids.add("847ab956-30bd-428a-84d8-83f5899f4bb9");
			targetGaids.add("546d7ee8-719d-422b-9976-15545867ef6c");
			targetGaids.add("07b91d78-e757-44e7-9af9-e52ae2e36110");
			targetGaids.add("4bd0bff7-b712-4f99-bde1-223df15f9f32");
			targetGaids.add("0694f4b5-d7d9-4378-9968-bced6ca8d4de");
			targetGaids.add("af10d7cd-762a-4b5e-9e02-8cd2656fa8ef");
			targetGaids.add("39044838-0afa-46ea-b994-3c24391731ca");
			targetGaids.add("d96b31ad-cb26-4284-a4d4-8bde79bb11d1");
			targetGaids.add("811ceeeb-08a7-4ef9-8351-db7eb7910264");
			targetGaids.add("eaf7f7c7-0263-49b8-a2a5-0ca6c6a1bce4");
			targetGaids.add("d35c350a-6bb6-415c-92d0-caf94fdb332e");
			targetGaids.add("1fb5a73d-f34c-4d7f-b712-483fbe7ec83a");
			targetGaids.add("ce9c9508-38ee-4b25-80fc-8d564cd3a760");
			targetGaids.add("8b6ad8ce-1ecc-45c5-91f1-208affe0bf43");
			targetGaids.add("c69bdd7a-0cd9-4494-a108-817e6faaa0f7");
			targetGaids.add("cf7ecb8f-ce09-492e-8dcd-5ccc48072ea1");
			targetGaids.add("c191d388-8770-44e4-9980-e77b953fd9f1");
			targetGaids.add("b25fa77e-5562-433b-bb06-7d2cc00d9a96");
			targetGaids.add("423175bf-c76b-4ea3-892c-0d7f71f9ea76");
			targetGaids.add("91c8f9b8-ef66-48c3-86e4-05bda1df7a13");
			targetGaids.add("52d7b0f6-c12f-423a-8a59-83cfc7aa8019");
			targetGaids.add("9fd05c5b-a14a-40fb-831e-df99616ad31a");
			targetGaids.add("72fef0dd-4129-43b7-9b61-98480b6fad35");
			targetGaids.add("95bb17b4-fd61-4c07-ab1d-da351525c579");
			targetGaids.add("1ec0bf23-fac1-46dd-99da-e9360653305b");
			targetGaids.add("cb145177-cac5-4c00-8840-ca8238d48375");
			targetGaids.add("be30da6d-eb75-4458-a8ad-ed76b8ca31db");
			targetGaids.add("52ab30f3-d756-4e12-ad72-40695e17b269");
			targetGaids.add("6d0555d5-18c3-4437-9063-ac3919302714");
			targetGaids.add("0a8625b7-87ca-4fde-bca5-aadb4025f410");
			targetGaids.add("923fc798-4d02-4d3c-b14e-3b0a8da970c1");
			targetGaids.add("096c6682-231d-4c58-80e6-921d9683f04e");
			targetGaids.add("2df806bb-91f9-4876-932d-5501fdc5bcaa");
			targetGaids.add("e826fd2b-caed-4a06-9fe2-2eb9ebb88671");
			targetGaids.add("bb559092-1906-44a6-ba72-c9e5d67c741c");
			targetGaids.add("5b03810c-751c-41fd-be54-6bdbf8f99650");
			targetGaids.add("fcfabac0-881d-44d7-9732-a04475c4d2e6");
			targetGaids.add("7560b89c-b60a-486c-8dce-6404c6f1318f");
			targetGaids.add("b011ce68-bd21-4a1c-9666-0c7dac5e6850");
			targetGaids.add("e5078f3b-c0f3-490b-8bc3-79049ac37323");
			targetGaids.add("d8a2e88a-d2cd-421e-ba67-f0e63b139dfc");
			targetGaids.add("cf5af3d5-09f9-4962-b7d9-58513853f1c8");
			targetGaids.add("c14f9dcb-11c8-4207-952e-1272d85418d8");
			targetGaids.add("7f1dce4c-f14b-4a1e-9c71-c12787cb0f9c");
			targetGaids.add("2e154611-5f15-4148-89b8-2bc73942cc96");
			targetGaids.add("9de54039-47ed-4404-8229-8df4e9b0e922");
			targetGaids.add("6738f4ce-597a-48e4-be65-8a7d022842d0");
			targetGaids.add("8d9ac5e3-40eb-4ba6-a28e-d1092b9f0044");
			targetGaids.add("b6fb4b6c-2c62-4872-b54f-25dd7227ea7e");
			targetGaids.add("0325270d-e28d-4c11-af2a-d607bf37b474");
			targetGaids.add("c4902124-24ad-467c-9a92-3fac5e6276a7");
			targetGaids.add("7e73bad7-3f76-4c3a-885c-2021c79cfcf8");
			targetGaids.add("19c633f0-dff9-4a08-a2dc-e6e840293fc6");
			targetGaids.add("10899753-e28a-4399-983c-0b3ff8816b6b");
			targetGaids.add("0f8948dd-bf48-4d04-80e0-dba5ec1baa90");
			targetGaids.add("ee2c67f4-751e-44eb-be70-9a11845b3289");
			targetGaids.add("4f3cdd4c-0448-4f32-b44d-7280a1b8f180");
			targetGaids.add("318dbb89-ea9d-4dee-9b31-1553b54b76f2");
			targetGaids.add("42b23e2b-8bc3-4ae1-92b4-3fa99bbc6561");
			targetGaids.add("2d51d1a2-c913-4d80-9d84-05bba3fbb347");
			targetGaids.add("07c73d59-bd0e-4f41-833e-22e034926e9a");
			targetGaids.add("06e00762-4373-4e02-bcef-ae549684ede9");
			targetGaids.add("3efa90cc-9bec-4589-a694-af173180b605");
			targetGaids.add("9e739eb4-a744-46a0-a8a3-433781df88d6");
			targetGaids.add("e539eac9-43dc-4713-a24d-05aadad79e52");
			targetGaids.add("c0d1865e-ec43-4740-91e3-711a5106fc59");
			targetGaids.add("db762f5f-9ea2-425c-a2ee-7c1b6ed872b8");
			targetGaids.add("d57e8ded-2e6f-4a8b-bbe2-89942f6a4509");
			targetGaids.add("799f21c4-10b0-46a2-a6f7-08d3556fbcaf");
			targetGaids.add("58b8898c-6515-4142-b840-95fbce1292bf");
			targetGaids.add("afd5a197-1161-4337-a5a8-c2341a58083d");
			targetGaids.add("74ac841f-1a85-43ca-b4c7-caa5e84661e6");
			targetGaids.add("e770c7e0-6984-433a-bcc0-32435e5779b2");
			targetGaids.add("043cf792-9272-496e-a9e9-6c2b88a79deb");
			targetGaids.add("a7b81880-fc0b-47bd-81b4-0cbb84fe7c1b");
			targetGaids.add("da40ff6c-5851-4dfb-a146-3752e55c34fb");
			targetGaids.add("b6d359f0-8744-4e89-93a7-6b1204e7676e");
			targetGaids.add("ee6fb527-b509-41fe-a303-0f91049f024b");
			targetGaids.add("328f2d82-8393-4942-bbb7-98ff24a7f2a2");
			targetGaids.add("3b9d7829-a693-4113-91c3-4db042ce004f");
			targetGaids.add("125d056a-b6bd-43f8-a041-b146bec72564");
			targetGaids.add("3f4104d5-f335-4b4a-9ff6-10be776b0ee8");
			targetGaids.add("c15c560d-79cc-4bc3-90b2-0c7ca40467fa");
			targetGaids.add("72979b97-20c2-4f8c-a634-ae251ac382a2");
			targetGaids.add("4a81e354-dc3d-4f4d-8d60-9958e9fe7714");
			targetGaids.add("97afd596-d39d-4f6f-a7f4-4c31fb86473c");
			targetGaids.add("d4cb81e6-1ab5-4316-a9ee-6e86e5849a62");
			targetGaids.add("3d9cffe6-874c-4115-8149-b0a31ece6d14");
			targetGaids.add("9238cefa-85c8-40a2-b485-2ea15c7e9157");
			targetGaids.add("6e5f6426-15ad-4c6a-83ca-d9e5bb68cdb8");
			targetGaids.add("65d2df06-6540-4464-b3af-c1dd419c2c72");
			targetGaids.add("11e46d96-af5c-4e9a-a961-c76de6b479b5");
			targetGaids.add("488fd746-00cd-4f9b-b302-894247ae7b6d");
			targetGaids.add("41ea7dfd-4b82-47e4-9dda-bffffa658ec9");
			targetGaids.add("3ae54882-5018-4782-8fc8-18003513ff90");
			targetGaids.add("4796ae62-301d-4f22-b85f-4a64ead3f017");
			targetGaids.add("d8ba7dfe-1590-43d6-aae8-ade22a42f792");
			targetGaids.add("0e790893-10aa-492b-8d4c-a0c6c89c1cf7");
			targetGaids.add("82474899-6cdc-472c-a0ad-41bc1774b423");
			targetGaids.add("babf226e-d128-4dc1-bb80-4c06d1b717a7");
			targetGaids.add("3e4bcc46-5914-4639-b0e8-1d3b782b0554");
			targetGaids.add("2d7fc97e-c391-414f-ad8a-b8b0f061d3dc");
			targetGaids.add("e198d129-ef37-4fad-a584-adf329014716");
			targetGaids.add("19e16b9c-9eb9-4753-a9e7-f1f8ab78b037");
			targetGaids.add("3bf97875-a505-4f81-b382-6d4e705d7c4d");
			targetGaids.add("e0aec5e2-5c57-4af6-9b88-c7ef88371784");
			targetGaids.add("ce79cdf1-ba41-4a09-971a-aee15cc4f792");
			targetGaids.add("a12b7433-c105-4c66-ad33-65d4e1369244");
			targetGaids.add("7a16f5da-1bc5-416b-ba53-c08ea14cc31b");
			targetGaids.add("17783a44-8662-4983-b73f-cb2e5b672b34");
			targetGaids.add("17cb824f-ed0e-41e4-ad72-97116db9adb5");
			targetGaids.add("af2f4f83-4f4c-493e-b9ee-0fd60c20828a");
			targetGaids.add("bbc5529f-c6dc-41a6-b07c-6628f2af3859");
			targetGaids.add("059194f9-5ac1-41c5-ad4e-d42d9c19eaf5");
			targetGaids.add("fd274543-acba-4dba-a7b6-3fa911bf0352");
			targetGaids.add("75a7d5e9-989c-49f6-8719-ff089823aa3c");
			targetGaids.add("2b86f87d-6c0c-4ebd-82e4-aca466c583a9");
			targetGaids.add("6303cacb-a55c-4f80-afb4-99496f412914");
			targetGaids.add("5335cdbf-57ff-48ee-a13d-743430828386");
			targetGaids.add("4d695ac7-5035-4c6d-b003-2c360d6ecfcf");
			targetGaids.add("3fc27e12-1220-4d99-9c01-3f44788c016b");
			targetGaids.add("401a3809-f276-4c4a-b234-b2f8b80bf115");
			targetGaids.add("371b3931-ce68-4232-b025-664fedc6d486");
			targetGaids.add("7cf1a8d6-1ab4-4e40-aa52-5219cd8446ad");
			targetGaids.add("3abe17c7-3847-4ece-b80a-a913c2b8b2e3");
			targetGaids.add("e557bd34-a00e-4c27-b36b-8dc0e75e06c8");
			targetGaids.add("aa48d9b1-d1ac-49f4-b48f-f62b7c738139");
			targetGaids.add("8e4c8941-1f10-4740-aaef-b75bc55bf447");
			targetGaids.add("c0bbd0e9-d712-40fe-ae90-7376889d8284");
			targetGaids.add("8e54edbf-bc66-4fa6-bf36-334c3cf580fa");
			targetGaids.add("4309c9c0-2d46-41a7-a4f8-c4285de9febf");
			targetGaids.add("6d230e78-962d-4f00-91ce-ff8b43b54043");
			targetGaids.add("43a506ad-cdb4-4fef-acfb-05406c47a995");
			targetGaids.add("7803a0c7-e178-4b16-a065-3e45afc3b7a4");
			targetGaids.add("f1496153-01eb-4923-b5d8-3efd47f5fa22");
			targetGaids.add("e368bc76-ffef-4544-8f42-fc54e17d0867");
			targetGaids.add("e5c0b4bf-c302-4422-8498-ea287acda33e");
			targetGaids.add("2c1a881e-9b50-461e-bc5d-69e343e4c2ef");
			targetGaids.add("88686ee6-5d47-4743-bdca-1b59659a5414");
			targetGaids.add("d4b4d9b2-d892-4e8d-b485-c8bd06f148ea");
			targetGaids.add("3628f704-83eb-47d0-beb3-16d63f1c56f3");
			targetGaids.add("54e52807-0f15-4887-82aa-ff2a39875204");
			targetGaids.add("164d5ea6-b81a-420f-a7e8-8fee0d4f699d");
			targetGaids.add("3044b4ba-ba86-4328-b457-8947d5994eb6");
			targetGaids.add("be060621-8ebd-4d1c-a691-e864f7d42752");
			targetGaids.add("db3d369c-f573-4746-978a-792e46168a53");
			targetGaids.add("0341194e-8ac3-4a9d-b642-c1e7813c676c");
			targetGaids.add("f5c2d397-69a5-4799-ad4b-93f628b41162");
			targetGaids.add("d23f84d6-79d7-46ca-91d3-ba80ac3977c7");
			targetGaids.add("3aa30876-6ac1-43e7-96a7-ba0d9ed420ec");
			targetGaids.add("d44e1f63-f3da-4f36-b443-80a2c943a55f");
			targetGaids.add("30d2d3ef-3519-4558-9ad5-5f9de010dda5");
			targetGaids.add("a3b6ed46-42ba-4280-b80e-951fb534f2f5");
			targetGaids.add("21babccb-accb-4d32-b2bb-060556650f33");
			targetGaids.add("ee1fd16c-210e-4ed4-abfd-f29303923f47");
			targetGaids.add("9b9ae088-aead-45b7-923e-00bcbc61a09d");
			targetGaids.add("1aa3c14f-892e-4395-81fc-0e1e7896e5e5");
			targetGaids.add("f430e7e7-7958-4bc3-95b8-9db4e381fbb1");
			targetGaids.add("9161ae86-c6d2-4106-9e1e-012e11b5d323");
			targetGaids.add("9f900683-2499-4305-b51c-6429cbe63b41");
			targetGaids.add("17c767cc-2ccd-4b4f-ba1c-a0b95c5b289a");
			targetGaids.add("b8af78e8-7cc4-4e43-ace7-21fe350292fa");
			targetGaids.add("10adde88-737c-495c-b7cc-786404cbb1b8");
			targetGaids.add("24ad20f2-0280-4e31-96ac-338290555487");
			targetGaids.add("ac8d7485-4563-473e-8597-a7b37e993270");
			targetGaids.add("e53441a2-72f8-4d36-ba93-f745db3aa3ed");
			targetGaids.add("409d2c00-cc03-4432-9ff3-5fb25fb59e79");
			targetGaids.add("a54e3605-3b67-4340-a305-004298d2b08c");
			targetGaids.add("12c6d8fa-afdc-45fc-b4be-1412918ef78e");
			targetGaids.add("dae6b7b8-be9c-485e-a4b2-459ebb7413cf");
			targetGaids.add("f79ea8dc-b545-4e65-95e1-d55a51b8d4b5");
			targetGaids.add("fdeb37d6-5b26-4378-9848-c21957c09a74");
			targetGaids.add("b4ee5bbe-f855-4a91-bc37-ecce97c97135");
			targetGaids.add("c0a63594-37a6-4137-90e2-ee0596d762ba");
			targetGaids.add("f475fe07-76e0-49cd-b369-ec8d72b82030");
			targetGaids.add("96c7c7e7-94a5-46cf-94b8-53b874fa3259");
			targetGaids.add("8cc2776d-9b35-491a-9b8d-3d677a1120f4");
			targetGaids.add("a1ccb196-547c-4d22-87e0-56469ce87378");
			targetGaids.add("1df06e81-ff31-4a66-acfa-7e817c526f24");
			targetGaids.add("303a119c-e7c6-440c-bf1e-d03502467d12");
			targetGaids.add("e9ad0652-4182-4349-90dc-fa0f96473f42");
			targetGaids.add("f548bec3-f977-466c-a6f2-ff4890f7fe11");
			targetGaids.add("7fb4b21e-2a8b-443c-8b6f-05d7b0b9feef");
			targetGaids.add("9a6e12ad-128f-47fb-8a23-ea0f0c24d745");
			targetGaids.add("3cd64a8a-db9d-4097-afc1-7bbda6383163");
			targetGaids.add("1c4b2e23-345e-413a-88ce-a4fa891ca114");
			targetGaids.add("4d931cd5-76cf-45eb-9329-dae429c9d563");
			targetGaids.add("63c579f2-439d-423f-adbd-5c4d5cd7f1c9");
			targetGaids.add("c69b8a6f-78fc-4b67-949d-a57aba81005f");
			targetGaids.add("08ccd3aa-e445-49fb-a2c6-782a905b2e34");
			targetGaids.add("bd0c2cb6-095e-4895-a286-ad4df7649701");
			targetGaids.add("307ade85-5c25-4a05-9554-98579be69e91");
			targetGaids.add("f0bcadf0-2cb6-4fc6-9ddb-32d9be8b58b9");
			targetGaids.add("63fa2b64-bb69-4a3c-83c8-1bdfa4f47bf3");
			targetGaids.add("c7aa47db-5100-4072-bd87-5d42c725c13d");
			targetGaids.add("60fb0152-dd5f-404b-a9b6-4da693a9dc4b");
			targetGaids.add("3f787602-dd41-4ce3-8906-e7ca00da45b1");
			targetGaids.add("3c026590-c74e-4795-9578-c6a2b9be6eb3");
			targetGaids.add("12565db3-5e86-4f5c-ba86-4c0382788bb6");
			targetGaids.add("31076add-1508-418c-b640-d637bd22e083");
			targetGaids.add("e75dca1b-1bdd-43f5-81b7-29691676354b");
			targetGaids.add("a70f9633-de8b-4e53-a3d4-a8bd5a3e6a68");
			targetGaids.add("9af17247-365b-469c-a438-7dbfc7ac48e5");
			targetGaids.add("af438fd7-43d0-48b5-9327-6772a5ada6bf");
			targetGaids.add("12545d85-1f65-4ea4-a45a-e52f304086b5");
			targetGaids.add("e6aaba84-0ec3-418d-b672-43e05abc4838");
			targetGaids.add("dbe3f629-36df-44df-8660-19193c05c109");
			targetGaids.add("07bd505b-f9c8-4f15-a7ec-00ab1e82357c");
			targetGaids.add("bbe02d54-09a9-463f-9829-5346404d8c98");
			targetGaids.add("9e523dc0-0855-41a9-9d9f-1b7f75c2ca8c");
			targetGaids.add("75a21df6-6e04-421c-b849-2368c7b8be94");
			targetGaids.add("0577e0d8-03be-4536-9e3c-6766f831f020");
			targetGaids.add("d0e40ea1-231a-4d46-a97f-0dcc91dc2ef4");
			targetGaids.add("8ceacc71-8d77-4d21-9deb-1cf519ea047b");
			targetGaids.add("ddb2bab2-7acd-4853-8dcb-e7c773e8ddfa");
			targetGaids.add("055a7074-0c52-4693-bb87-0d57338e77f2");
			targetGaids.add("376c209b-6d30-4bb4-ad14-21bb6d9e47c8");
			targetGaids.add("50999aa7-1193-405f-a60d-086474a69d57");
			targetGaids.add("fe851f12-5b74-4fe6-b686-0664f24c6b9c");
			targetGaids.add("78aa5979-3a26-47b1-9338-bcd7fc846fd4");
			targetGaids.add("91f03cf6-7a7f-4949-9234-0ba6dc8fc049");
			targetGaids.add("6825251f-b569-4b84-b7e9-b293f68c6b98");
			targetGaids.add("55afadc2-4f8b-4a69-9874-65dfd0a35ab4");
			targetGaids.add("78c920b8-1573-4dee-a116-b8861de2d09f");
			targetGaids.add("80c256e0-743e-455f-b41e-67e407eed27d");
			targetGaids.add("16861924-bbf8-460d-9079-84fdbb29de24");
			targetGaids.add("5f02aa93-243d-488d-8647-277979bbb7e7");
			targetGaids.add("ec3a13ac-2014-41fc-9626-eca8eb0aacce");
			targetGaids.add("5deef7cc-646b-4359-9a3b-e036ab084b66");
			targetGaids.add("8515fa2b-b48f-4551-af19-1473e36ce223");
			targetGaids.add("d2011bec-07a9-46e0-90b6-68652bd2b313");
			targetGaids.add("cc207023-46a3-42e3-b96b-7031249b0582");
			targetGaids.add("692ccb59-017e-4745-8549-ef79e2d11299");
			targetGaids.add("99e6975c-1294-478d-9f9e-ed276a989903");
			targetGaids.add("0106cb56-6e24-4708-8ad2-d34d5dd3cdad");
			targetGaids.add("a54850e8-b382-4891-a7ae-5cb0d2c4155a");
			targetGaids.add("5ca4b340-28bf-4cb0-bdf9-287a1970368a");
			targetGaids.add("77889335-e679-426c-9c9f-0de4778033b0");
			targetGaids.add("edd01ed0-8aca-4bc8-bcec-086814a535b1");
			targetGaids.add("3620122b-49a7-459f-a2a2-43163e0f96ae");
			targetGaids.add("0e8a677d-fa3a-4ac4-9a2b-5595bc4e14c2");
			targetGaids.add("b1667297-c820-4168-b1de-1b3d6da6d470");
			targetGaids.add("bfe652d1-0639-47bb-9410-ab4db02820a0");
			targetGaids.add("08a46046-fa68-4400-b18c-1be60377948d");
			targetGaids.add("19ed8c98-fc2b-42b8-aa4e-58991adccf6a");
			targetGaids.add("e80f91c8-cb84-4ba4-8592-8d2feeec3e85");
			targetGaids.add("ad6e553e-7241-405b-8458-e599b664a0af");
			targetGaids.add("cbd78b02-33a0-408e-8bcf-9b680cbea6e5");
			targetGaids.add("50e45a80-31a2-4dba-bfe8-4ee5eddeb5e1");
			targetGaids.add("698623a5-980e-4364-81a5-c2c32bc1dd25");
			targetGaids.add("3a51e12a-2aae-41a6-a835-87c33d5cab31");
			targetGaids.add("aaacdbf2-900c-48a5-bebb-ccc85c727515");
			targetGaids.add("bdb9119f-b4e3-42e4-8a52-6cc3c2d07cdc");
			targetGaids.add("0b5bfa22-4c0f-487a-b1fc-5b62908dbbf5");
			targetGaids.add("915eb98c-0c40-499d-b756-5498e7597dd6");
			targetGaids.add("dd51d92b-1b58-433d-9340-9235892fae8d");
			targetGaids.add("f9d97afe-a590-4200-a965-280ad0d2458d");
			targetGaids.add("a0ef5c89-39e3-4b4b-9714-3e5ac83ab76b");
			targetGaids.add("333c545e-bc71-40f3-a93f-40e74393774b");
			targetGaids.add("63021317-5f13-4dbf-8bf3-cb7cea4a7fce");
			targetGaids.add("970e0f43-037b-4cdf-9cdd-2c03a5a7e2a3");
			targetGaids.add("ecfaf994-a027-410b-80a4-4991c56fc9f5");
			targetGaids.add("ef676ee5-aec3-4f80-a4f1-8b7f4849fd22");
			targetGaids.add("81e3349f-c0e7-4b74-94e1-9840007f8f4c");
			targetGaids.add("e7b06988-44c7-4285-b133-16a947ecddbb");
			targetGaids.add("acc5c196-51d2-48c6-b692-7875b4495c8d");
			targetGaids.add("edc9f77d-8217-4ed3-996f-090178c94528");
			targetGaids.add("916b4354-c81f-4ce5-bb31-7288613f1102");
			targetGaids.add("76f84458-eff5-4d6f-a39a-fd944e6d5aa8");
			targetGaids.add("dc3bf32b-2931-4ce4-bcdc-b7ee7536f6f9");
			targetGaids.add("feb2ed4b-01f7-4f52-bd76-b474aa69cc64");
			targetGaids.add("5fb73260-3d40-4f32-8bea-e0190c0046c2");
			targetGaids.add("e2ca4a0a-800c-4d56-a0e4-40d0bfc53fd8");
			targetGaids.add("19a6a1a0-c1c5-40fd-82f1-ff53d9572c19");
			targetGaids.add("777821b9-2ce4-4e40-9e9c-5c79ed0f71c3");
			targetGaids.add("e106d0d1-249b-44e4-bba5-5c8d4eeb3d25");
			targetGaids.add("349084b4-0ab3-4603-9a99-2ca68f2611f0");
			targetGaids.add("7bc246cf-addb-49bc-b2a2-39c732135ea4");
			targetGaids.add("e589e395-9bf9-481b-a5de-a8fd606d5343");
			targetGaids.add("0b344e82-18a7-4615-8621-2dd09248834f");
			targetGaids.add("9732e38c-b08d-4b04-9b1a-a3181919191a");
			targetGaids.add("e6e3fc08-5146-41ba-9b70-e12993913877");
			targetGaids.add("48e47a0f-8bb3-4009-a0cf-ec989b279a10");
			targetGaids.add("22cbaf09-d74a-461c-8ed3-5a033bb8208e");
			targetGaids.add("d08956aa-af38-4d02-a3a4-70804f5466c2");
			targetGaids.add("abb79719-6214-42bf-ba2c-46d0474b0909");
			targetGaids.add("3a22279a-4528-4bcf-acc0-3dce50df1393");
			targetGaids.add("38e1a192-5b1b-4bf8-9efe-ef39bcbd37c6");
			targetGaids.add("37d5655d-e46c-4804-906a-b0316d489ae8");
			targetGaids.add("17122b77-8791-4661-a7d8-3e79683d1636");
			targetGaids.add("9b167166-b20c-4a1a-9efe-ab8a93704814");
			targetGaids.add("fcb941c5-0357-4cee-90b3-0c3865fbb14d");
			targetGaids.add("b890f6b3-ed5f-4878-84db-4f7435ffe6d4");
			targetGaids.add("7c229709-bfc8-48d4-aae3-3e8febb60e39");
			targetGaids.add("6c7ed683-fb68-4823-a2fd-c0833a3efeeb");
			targetGaids.add("fcea3cfe-7fc0-463b-aa1f-92771ca74627");
			targetGaids.add("f7a89ba5-5642-4b68-92b1-c989c9357c9e");
			targetGaids.add("cb92473b-6fee-4000-bcf3-771758cb89c8");
			targetGaids.add("49551d6c-efad-423e-885b-0530e9685e25");
			targetGaids.add("eaac3f0d-5ea0-41bc-bc2b-c9a6ecade222");
			targetGaids.add("9693f677-089e-4ce6-b902-aabed10ad88a");
			targetGaids.add("01c0128d-6ef2-4010-92ab-4a5e443492e6");
			targetGaids.add("949a21f3-a5c5-456c-896c-3b1775223acf");
			targetGaids.add("4c83d8c3-63ac-4593-be76-ccefdab3123b");
			targetGaids.add("37b2a1d2-c6d4-4dee-85a6-6b77901d9f0a");
			targetGaids.add("8338a594-0895-4ddd-b890-44201abe66fa");
			targetGaids.add("f56b8cd8-75e8-4fa5-9182-2428d877ccd9");
			targetGaids.add("f70b358f-9ac4-4e3e-8841-adf6b2d1d061");
			targetGaids.add("2633fcae-00b9-4c1d-8d70-360e82c65c2e");
			targetGaids.add("fff7e422-d41e-4135-a7c6-cb7aba4d93e8");
			targetGaids.add("063c7a7c-44d2-4d22-a1a7-0d72352fdc08");
			targetGaids.add("e7e5ce0b-fe62-4024-a5af-9e8b7cced63d");
			targetGaids.add("f63f7281-a8e3-4b85-aeb6-5ed1f4fdb751");
			targetGaids.add("47282c8e-e2c7-4670-ad31-ed9c00be8026");
			targetGaids.add("51a8adf2-5778-4d80-b8ab-8873388c7c01");
			targetGaids.add("325cd416-69b8-4327-a3cf-eadb60b577f8");
			targetGaids.add("9f5c9b90-4d45-47e0-ad72-3cd395b567fe");
			targetGaids.add("1a6502aa-f6ab-4050-9132-0ad296bb2151");
			targetGaids.add("0df7f9fd-3ac3-4b94-8ba6-391c5e6a427a");
			targetGaids.add("467c5677-75f6-4420-a6a0-f58954ed5e7c");
			targetGaids.add("9d9763a6-604c-4805-893d-7ffc5f42d5ff");
			targetGaids.add("159fe424-54b0-46bf-abfd-5f948b08816c");
			targetGaids.add("3c0eeae1-873c-40ec-b138-875ca70f2f78");
			targetGaids.add("2b03fa3e-55b0-4deb-98e9-443b97039060");
			targetGaids.add("29d4dff3-101a-4539-938c-a087fad9afcc");
			targetGaids.add("3cb2fab9-ba60-4cf3-affc-df5873a59911");
			targetGaids.add("b4a4f1ac-f05a-491d-8a75-d156bf101e86");
			targetGaids.add("2f19f6d7-90f4-4af0-a1dd-54f012b59a79");
			targetGaids.add("d9f6a53b-d824-4fec-9620-97f778ae9c7d");
			targetGaids.add("79581bbc-88ec-44b7-92c0-d3bbb4e8b637");
			targetGaids.add("f3eed61a-7ab7-4004-9ad6-8a551dceeea5");
			targetGaids.add("0ef547be-6d3b-43db-b5e4-445988e78ea7");
			targetGaids.add("09460fa9-1e62-4d38-9862-771cc21b5bf4");
			targetGaids.add("ad3cee0b-28a7-427c-b77b-05c373beb6f4");
			targetGaids.add("8ef73428-a08a-45b0-8710-afe974fc954e");
			targetGaids.add("ba03fe08-803d-46bc-8722-cfaad7303949");
			targetGaids.add("2c3073e5-a9cc-4383-b3e3-91ca2c0e9ae8");
			targetGaids.add("b07ebe55-8fc7-4d1a-979e-82a7c54be2e6");
			targetGaids.add("28750f38-66b2-400c-a16b-ea960edad293");
			targetGaids.add("2821301e-93a4-41d7-8ec0-3f5c10d4f4cb");
			targetGaids.add("ecce7ba1-fd20-429e-afdf-9bec2d85fc92");
			targetGaids.add("480b1499-8df5-4905-940f-ebd91b981b36");
			targetGaids.add("0c0df0fc-83a2-4bc2-b253-ecde6347bb55");
			targetGaids.add("49f9653e-fea6-4d3c-b235-6bb54bcf63ba");
			targetGaids.add("cab88045-3272-4aa1-a200-e17fdbc5f8d5");
			targetGaids.add("1c42e43a-7346-4958-871e-a347b6b23c1a");
			targetGaids.add("2f2fd6b8-71dd-48e6-b14d-a1074581c4d8");
			targetGaids.add("3daa853f-821b-41f3-be8c-efb4e4ec18e0");
			targetGaids.add("956579cf-bb5a-49fd-a669-cb974a1f68dd");
			targetGaids.add("0453128f-38c3-4262-b055-7aa8918d8441");
			targetGaids.add("63a40250-52c0-4b56-a036-c4a096d1d255");
			targetGaids.add("cddc1edb-6201-4cc2-a152-8c707ea71b5a");
			targetGaids.add("eddb211c-f03c-4555-aab9-38f50071399f");
			targetGaids.add("8a068c9c-dd5c-4148-83f4-2023a0ed056c");
			targetGaids.add("4e90b659-7cf8-42ef-8619-d94e632e0975");
			targetGaids.add("14c8788c-f36b-4a5f-b2b3-d09e145b2e75");
			targetGaids.add("80c9ab58-8d37-4b57-a276-c1c511708acc");
			targetGaids.add("e0a6c91f-8667-4347-8790-7206f8222604");
			targetGaids.add("8c0079fe-c955-4a48-b98b-7d7a70a38afd");
			targetGaids.add("f3e0473b-358b-4116-a2e1-fa3f0b9d7dce");
			targetGaids.add("4641feb1-0002-40fb-9963-ebe8f768d40f");
			targetGaids.add("4823d41f-a9fe-4b1a-b488-0dc6bb13d5dd");
			targetGaids.add("e5633333-c108-4fba-8f98-7be87e6b6f25");
			targetGaids.add("fc5f0282-d2a9-4f39-81e7-520a86f432f8");
			targetGaids.add("a687bd0b-69f1-4b2f-a9ff-007e4e39d5ee");
			targetGaids.add("41638e08-936b-4d25-b740-bfc9f8d8351c");
			targetGaids.add("58a516e0-5e4c-4fd9-bf3a-d8a66e7e42c8");
			targetGaids.add("14995d6d-a788-43de-b109-6e78491492c8");
			targetGaids.add("7b9f7302-3ec9-47eb-84aa-753040abcbcf");
			targetGaids.add("8b05a6a8-8250-470b-8284-7bbd2e3cfd54");
			targetGaids.add("cf1a40c4-4513-495f-806d-e7047a132f00");
			targetGaids.add("ed6aaab6-9adf-442c-9187-8efa65b06837");
			targetGaids.add("2b35c44f-2d8b-4b7f-88cc-770adf2dedf8");
			targetGaids.add("f1722b37-5777-4043-8b8b-7a4c23c68476");
			targetGaids.add("b60110ae-fefc-4660-b874-95c40cc4e2a6");
			targetGaids.add("bc4e107e-335d-4ace-b5c1-283f1b070232");
			targetGaids.add("e1376c43-6ae7-47d1-b960-ebf9fb1bb305");
			targetGaids.add("be30bab2-41e4-40c4-bfb4-3dc3599d4d14");
			targetGaids.add("32cc393c-9a33-4b7d-a9cb-6e843e58b5dd");
			targetGaids.add("5718c1ff-b457-4dce-bc8d-87d7998d9103");
			targetGaids.add("4d2e4fa0-1579-4b04-8194-92474a68b0a2");
			targetGaids.add("fa113384-df3c-4b62-a490-9c2a170e0bd1");
			targetGaids.add("05dd79cd-92fe-4c8c-8134-256ae35360be");
			targetGaids.add("96b1ca0d-4d14-44fe-9138-74b2f24a7f5a");
			targetGaids.add("1667e268-8c7a-45c5-8420-e5e61ee2574f");
			targetGaids.add("ba82e688-743f-4806-be53-777334148a95");
			targetGaids.add("8512c14d-9389-4c8a-9009-d6349e1b16fa");
			targetGaids.add("2829f832-2015-49d5-b9a2-ceaa22689c8d");
			targetGaids.add("846d72df-0b3f-4958-a593-f504aef7de37");
			targetGaids.add("0dcb3e5d-3458-40ac-97dc-9f7c657dee93");
			targetGaids.add("d6b7ef63-7a36-478e-85af-fef9e112e2bd");
			targetGaids.add("1d116236-fa7b-49c9-888c-87921210f147");
			return  (deviceInfo != null && deviceInfo.getDeviceId() != null && deviceInfo.getDeviceId().length() == 36 && targetGaids.contains(deviceInfo.getDeviceId()));
		}
	}

	/**
	 * KeyedProcessFunction用于保留每个设备ID最新的记录
	 */
	public static class DeviceIdDeduplicateWithBloomFilter extends KeyedProcessFunction<String, DeviceInfo, DeviceInfo> {
		private transient BloomFilter<String> bloomFilter;
		private ValueState<DeviceInfo> deviceInfoState;


		@Override
		public void open(OpenContext openContext) throws Exception {
			super.open(openContext);
			System.out.println("创建布隆过滤器");
			bloomFilter = BloomFilter.create(Funnels.stringFunnel(StandardCharsets.UTF_8), 10000, 0.01);
			ValueStateDescriptor<DeviceInfo> descriptor = new ValueStateDescriptor<>("deviceInfo", DeviceInfo.class);
			deviceInfoState = getRuntimeContext().getState(descriptor);
		}

		@Override
		public void processElement(DeviceInfo value, KeyedProcessFunction<String, DeviceInfo, DeviceInfo>.Context ctx, Collector<DeviceInfo> out) throws Exception {
			if (bloomFilter.mightContain(value.getDeviceId())) {
				DeviceInfo storedDeviceInfo = deviceInfoState.value();
				System.out.println("布隆过滤器判定存在");
				if (storedDeviceInfo == null || value.getTimestamp() > storedDeviceInfo.getTimestamp()) {
					if (storedDeviceInfo == null) {
						System.out.println("状态判定不存在");
					}
					System.out.println("更新" + value.getDeviceId() + "时间戳为" + value.getTimestamp());
					deviceInfoState.update(value);
					out.collect(value);
				} else {
					System.out.println("已存在" + value.getDeviceId() + "时间戳为" + storedDeviceInfo.getDeviceId() + "当前数据时间戳" + value.getTimestamp());
				}
			} else {
				System.out.println("布隆过滤器判定不存在");
				bloomFilter.put(value.getDeviceId());
				deviceInfoState.update(value);
				out.collect((value));
			}
		}
	}

	/**
	 * 获取当前日期路径（格式：yyyyMMdd）
	 */
	private static String getCurrentDatePath() {
		return DateFormatUtils.format(new Date(), "yyyyMMdd");
	}
}
